package com.shujia

import scala.language.implicitConversions

object Demo20Implicit1 {
  def main(args: Array[String]): Unit = {
    // 隐式转换：给对象动态地增加方法

    /**
     * 分为三类：
     * 隐式转换方法
     * 隐式转换变量
     * 隐式转换类
     */

    // 1、隐式转换方法

    def func1(i: Int): Unit = {
      println(i + 100)
    }

    func1(10) // 110
    func1(100) // 200

    val str: String = "123"
    //    func1(str) // 类型不匹配 func1函数需要一个Int类型的参数
    func1(Integer.parseInt(str)) // 手动的将 str => Int 类型

    // 隐式转换方法
    implicit def str2int(str: String): Int = {
      println("调用了隐式转换方法")
      Integer.parseInt(str)
    }

    // 同一个作用域范围内只能存在一个同类型（函数的参数和函数的返回值类型相同）的函数
    //    implicit def str2int2(str: String): Int = {
    //      Integer.parseInt(str) + 1
    //    }

    func1(str2int(str)) // 使用自定义的str2int方法 将str => Int 类型
    // 可以省略str2int方法调用过程
    // str2int是一个隐式转换方法
    // 虽然func1需要Int类型的参数，这里传入了String类型的变量
    // 但是最后会自动寻找一个隐式转换函数（可以将String类型转换为Int的一个函数）
    func1(str)

  }

}
